import type { Metadata, Viewport } from 'next'
import { Inter } from 'next/font/google'

import { getConfig } from '@/lib/config'
import RuntimeConfig from '@/lib/runtime'

import { GlobalErrorIndicator } from '../components/GlobalErrorIndicator'
import { QueryProvider } from '../components/QueryProvider'

import { SiteProvider } from '../components/SiteProvider'
import { ThemeProvider } from '../components/ThemeProvider'
import './globals.css'
import 'sweetalert2/dist/sweetalert2.min.css'

const inter = Inter({ subsets: ['latin'] })

// 动态生成 metadata，支持配置更新后的标题变化
export async function generateMetadata(): Promise<Metadata> {
  let siteName = process.env.SITE_NAME || 'nova-tv'
  if (
    process.env.NEXT_PUBLIC_STORAGE_TYPE !== 'd1'
    && process.env.NEXT_PUBLIC_STORAGE_TYPE !== 'upstash'
  ) {
    const config = await getConfig()
    siteName = config.SiteConfig.SiteName
  }

  return {
    title: siteName,
    description: '影视聚合',
    manifest: '/manifest.json',
    icons: {
      icon: '/logo.png',
      shortcut: '/logo.png',
      apple: '/logo.png',
    },
    other: {
      'logo/icon': '/logo.png',
    },
  }
}

export const viewport: Viewport = {
  themeColor: '#000000',
  viewportFit: 'cover',
}

export default async function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  let siteName = process.env.SITE_NAME || 'nova-tv'
  let announcement
    = process.env.ANNOUNCEMENT
      || '本网站仅提供影视信息搜索服务，所有内容均来自第三方网站。本站不存储任何视频资源，不对任何内容的准确性、合法性、完整性负责。'
  let enableRegister = process.env.NEXT_PUBLIC_ENABLE_REGISTER === 'true'
  let imageProxy = process.env.NEXT_PUBLIC_IMAGE_PROXY || ''
  let doubanProxy = process.env.NEXT_PUBLIC_DOUBAN_PROXY || ''
  let disableYellowFilter
    = process.env.NEXT_PUBLIC_DISABLE_YELLOW_FILTER === 'true'
  let customCategories
    = (RuntimeConfig as any).custom_category?.map((category: any) => ({
      name: 'name' in category ? category.name : '',
      type: category.type,
      query: category.query,
    })) || ([] as Array<{ name: string, type: 'movie' | 'tv', query: string }>)
  if (
    process.env.NEXT_PUBLIC_STORAGE_TYPE !== 'd1'
    && process.env.NEXT_PUBLIC_STORAGE_TYPE !== 'upstash'
  ) {
    const config = await getConfig()
    siteName = config.SiteConfig.SiteName
    announcement = config.SiteConfig.Announcement
    enableRegister = config.UserConfig.AllowRegister
    imageProxy = config.SiteConfig.ImageProxy
    doubanProxy = config.SiteConfig.DoubanProxy
    disableYellowFilter = config.SiteConfig.DisableYellowFilter
    customCategories = config.CustomCategories.filter(
      category => !category.disabled,
    ).map(category => ({
      name: category.name || '',
      type: category.type,
      query: category.query,
    }))
  }

  // 将运行时配置注入到全局 window 对象，供客户端在运行时读取
  const runtimeConfig = {
    STORAGE_TYPE: process.env.NEXT_PUBLIC_STORAGE_TYPE || 'localstorage',
    ENABLE_REGISTER: enableRegister,
    IMAGE_PROXY: imageProxy,
    DOUBAN_PROXY: doubanProxy,
    DISABLE_YELLOW_FILTER: disableYellowFilter,
    CUSTOM_CATEGORIES: customCategories,
  }

  return (
    <html lang="zh-CN" suppressHydrationWarning>
      <head>
        <meta
          name="viewport"
          content="width=device-width, initial-scale=1.0, viewport-fit=cover"
        />
        <script
          dangerouslySetInnerHTML={{
            __html: `window.RUNTIME_CONFIG = ${JSON.stringify(runtimeConfig)};`,
          }}
        />
      </head>
      <body
        className={`${inter.className} min-h-screen bg-white text-gray-900 dark:bg-black dark:text-gray-200`}
      >
        <ThemeProvider
          attribute="class"
          defaultTheme="system"
          enableSystem
          disableTransitionOnChange
        >
          <QueryProvider>
            <SiteProvider siteName={siteName} announcement={announcement}>
              {children}
              <GlobalErrorIndicator />
            </SiteProvider>
          </QueryProvider>
        </ThemeProvider>
      </body>
    </html>
  )
}
